/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    // 滑动窗口
    let substringSet = new Set()
    let cur = 0
    let max = 0
    for (let i = 0; i < s.length; i++) {
        // 移动窗口左指针右移一位
        if (i > 0) {
            substringSet.delete(s.charAt(i - 1))
        }
        while (cur < s.length && !substringSet.has(s.charAt(cur))) {
            // 如果set中没包含右移指针所在的字符，添加
            substringSet.add(s.charAt(cur++))
        }
        // 本次移动窗口创建完成，比对
        max = Math.max(max, cur - i)
    }
    return max
};